﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using GestionePolveri2.DAL;
using GestionePolveriLib.BL;
using FrameworkLib.Facades;
using System.Data.Objects;

namespace GestionePolveriLib.Facades
{
    [Serializable]
    public class TurniFacade : FacadeBase<GestionePolveriEntities>
    {
        public TurniFacade()
        {

        }

        public void LoadTurniAsync(BackgroundWorkerCallbackBase.Callback callback)
        {
            this.RunAsync(() => Get(), callback);
        }

        public List<GestionePolveriLib.BL.Turno> Get()
        {
            List<GestionePolveriLib.BL.Turno> retValue = null;

            try
            {
                var obj = from x in this.GetContext().Turni
                          where x.Enabled.Value && !x.Descrizione.Equals("N.D.", StringComparison.InvariantCultureIgnoreCase)
                          select new GestionePolveriLib.BL.Turno
                          {
                              Id = x.IDTurno,
                              Descrizione = x.Descrizione,
                              Start = x.StartTime,
                              End = x.EndTime,
                              Attivo = x.Enabled.Value
                          };

                if (obj.Any())
                {
                    retValue = obj.ToList();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return retValue;
        }

        //public List<GestionePolveriLib.BL.Turno> Get(short idTurno)
        //{
        //    List<GestionePolveriLib.BL.Turno> retValue = null;

        //    if (idTurno == null) return null;

        //    try
        //    {
        //        var obj = from x in this.GetContext().Turni
        //                  where x.Enabled.Value && !x.Descrizione.Equals("N.D.", StringComparison.InvariantCultureIgnoreCase)
        //                  select new GestionePolveriLib.BL.Turno
        //                  {
        //                      Id = x.IDTurno,
        //                      Descrizione = x.Descrizione,
        //                      Start = x.StartTime,
        //                      End = x.EndTime,
        //                      Attivo = x.Enabled.Value
        //                  };

        //        if (obj.Any())
        //        {
        //            retValue = obj.ToList();
        //        }
        //    }
        //    catch (Exception ex)
        //    {
        //        throw ex;
        //    }

        //    return retValue;
        //}

        public List<GestionePolveriLib.BL.Turno> GetAll()
        {
            List<GestionePolveriLib.BL.Turno> retValue = null;

            try
            {
                var obj = from x in this.GetContext().Turni
                          where !x.Descrizione.Equals("N.D.", StringComparison.InvariantCultureIgnoreCase)
                          select new GestionePolveriLib.BL.Turno
                          {
                              Id = x.IDTurno,
                              Descrizione = x.Descrizione,
                              Start = x.StartTime,
                              End = x.EndTime,
                              Attivo = x.Enabled.Value
                          };

                if (obj.Any())
                {
                    retValue = obj.ToList();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return retValue;
        }

        public bool Add(GestionePolveriLib.BL.Turno turno)
        {
            bool retValue = false;

            try
            {
                GestionePolveri2.DAL.Turni obj = new GestionePolveri2.DAL.Turni();
                obj.Descrizione = turno.Descrizione;
                obj.StartTime = turno.Start.GetValueOrDefault();
                obj.EndTime = turno.End;
                obj.Enabled = turno.Attivo;

                this.GetContext().Turni.AddObject(obj);
                this.GetContext().SaveChanges();

                retValue = true;
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return retValue;
        }

        public bool Delete(GestionePolveriLib.BL.Turno turno)
        {
            bool retValue = false;

            try
            {
                var obj = from x in this.GetContext().Turni
                          where x.IDTurno == turno.Id
                          select x;

                if (obj.Any())
                {
                    this.GetContext().Turni.DeleteObject(obj.FirstOrDefault());
                    this.GetContext().SaveChanges();

                    retValue = true;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return retValue;
        }

        public bool Modify(GestionePolveriLib.BL.Turno turno)
        {
            bool retValue = false;

            try
            {
                var obj = from x in this.GetContext().Turni
                          where x.IDTurno == turno.Id
                          select x;

                if (obj.Any())
                {
                    GestionePolveri2.DAL.Turni turnoDB = obj.FirstOrDefault();
                    turnoDB.Descrizione = turno.Descrizione;
                    turnoDB.StartTime = turno.Start.GetValueOrDefault();
                    turnoDB.EndTime = turno.End.GetValueOrDefault();
                    turnoDB.Enabled = turno.Attivo;

                    this.GetContext().SaveChanges();

                    retValue = true;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return retValue;
        }

        public bool ExistMovimentiXTurno(int idTurno)
        {
            bool retValue = false;

            try
            {
                var obj = from x in this.GetContext().Movimenti
                          where x.IDTurno == idTurno
                          select x;

                if (obj.Any())
                {
                    retValue = true;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return retValue;
        }

        public GestionePolveriLib.BL.Turno GetTurnoND()
        {
            GestionePolveriLib.BL.Turno retValue = null;

            try
            {
                var obj = from x in this.GetContext().Turni
                          where x.Descrizione.Equals("N.D.", StringComparison.InvariantCultureIgnoreCase)
                          select new GestionePolveriLib.BL.Turno
                          {
                              Id = x.IDTurno,
                              Descrizione = x.Descrizione,
                              Start = x.StartTime,
                              End = x.EndTime,
                              Attivo = x.Enabled.Value
                          };

                if (obj.Any())
                {
                    retValue = obj.FirstOrDefault();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return retValue;
        }
    }
}
